package com.ssm.utils;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import org.apache.log4j.Logger;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ssm.model.CaseObj;

public class CaseUtils {

	private static Logger logger = Logger.getLogger(CaseUtils.class);

	/**
	 * 解析caseJsonInfos，生成zTree可以使用的数据
	 * */
	public synchronized static JSONArray analyseToZNodes(List<CaseObj> caseObjs) {
		
		JSONArray zNodes = new JSONArray();
		
		HashMap<String, String> map = new HashMap<String, String>();
		
		for (CaseObj caseObj : caseObjs) {
			
			// 节点属性初始化
			String nodeID = "";
			String nodePID = "";
			String nodeCaseName = "";
			boolean nodeStatus = true;
			String nodeIcon = "";
			String nodeCaseNum = "";
			int nodeCaseStatus = 1;
			
			String[] foldersShort = caseObj.getPath().split("//");
			StringBuffer folderTemp = new StringBuffer();
			
			// 检查这个用例的目录是否存在，不存在则创建
			for (int i = 0; i < foldersShort.length; i++) {
				
				// 第三个节点开始，默认收起
				if (i > 1) {
					nodeStatus = false;
				} else {
					nodeStatus = true;
				}
				
				String folder = foldersShort[i];
				
				folderTemp.append(folder);
				folderTemp.append("//");
				
				// 如果全路径不存在，则创建这个路径下的folder节点
				if (map.get(folderTemp.toString()) == null) {
					
					// folder的id是全路径
					nodeID = folderTemp.toString();
					// folder的name是当前路径
					nodeCaseName = folder;
					
					// 创建并添加一个folder节点
					JSONObject folderNode = new JSONObject();
					folderNode.put("id", nodeID);
					folderNode.put("pId", nodePID);
					folderNode.put("name", nodeCaseName);
					folderNode.put("open", nodeStatus);
					zNodes.add(folderNode);

					// 将当前folder层级的id传递给pid（下一层节点使用这个pid）
					nodePID = nodeID;
					
					// 没有太大的意义，只是用来判断当前folder是否已经创建了
					map.put(folderTemp.toString(), nodePID);
				}
				// 如果全路径已存在，只需要更新作为下一级使用的PID
				else {
					
					// 更新作为下一级使用的PID
					nodePID = folderTemp.toString();
				}
			}
			
			// 设置ID，用例其实不需要设置id，因为他没有下一级
			nodeID = caseObj.getName();
			// 设置Name
			nodeCaseName = caseObj.getName();
			// 设置自定义属性：用例编号
			nodeCaseNum = caseObj.getNum();
			// 设置自定义属性：用例状态
			nodeCaseStatus = caseObj.getStatus();
			// 根据最后一次执行结果，设置用例图标
			String caselastResult = caseObj.getLastresult();
			switch (caselastResult) {
			case "NA":
				nodeIcon = "./css/plugins/ztree/img/diy/casena.png";
				break;
			case "Pass":
				nodeIcon = "./css/plugins/ztree/img/diy/casepass.png";
				break;
			case "Fail":
				nodeIcon = "./css/plugins/ztree/img/diy/casefail.png";
				break;
			case "Block":
				nodeIcon = "./css/plugins/ztree/img/diy/caseblock.png";
				break;
			default:
				throw new RuntimeException("caselastResult error: " + caselastResult);
			}
			
			// 创建并添加一个用例节点
			JSONObject caseNode = new JSONObject();
			// 设置用例基本属性
			caseNode.put("id", nodeID);
			caseNode.put("pId", nodePID);
			caseNode.put("name", nodeCaseName);
			caseNode.put("num", nodeCaseNum);
			caseNode.put("status", nodeCaseStatus);
			caseNode.put("icon", nodeIcon);
			
			zNodes.add(caseNode);
		}
		
		logger.debug("getall zNodes: " + zNodes.toJSONString() + ";");
		
		return zNodes;
		
	}
	
	/**
	 * 将excel中的用例读出来，每个用例一个JsonObject
	 * 组装成一个JsonArray返回
	 * */
	public synchronized static JSONArray analyseCaseExcel(File file) {
	
		JSONArray caseArry = new JSONArray();
		
		try {
			Workbook workbook = new XSSFWorkbook(file);
			
			// 遍历一下所有的sheet
			Iterator<Sheet> sheetIterator = workbook.sheetIterator();
			
			while (sheetIterator.hasNext()) {
				
				Sheet sheet = sheetIterator.next();
				
				ArrayList<String> folderList = new ArrayList<String>();
				// 文件名作为第一层级
				folderList.add(file.getName().replace(".xlsx", ""));
				// sheet作为第二层级
				folderList.add(sheet.getSheetName());
				
				StringBuffer folderBuffer = null;
				
				// 读取这个sheet中的case信息：以.开头的为层级，以>开头的为用例
				int lastRowNumber = sheet.getLastRowNum();
				for (int i = 0; i <= lastRowNumber; i++) {
					
					Row row = sheet.getRow(i);
					
					String cellValue_index_0 = row.getCell(0).getStringCellValue().trim();
					
					if (cellValue_index_0.contains("*")) {
						
						int folderDepth = cellValue_index_0.length() + 1;
						int folderSize = folderList.size();
						
						// 如果folderList已包含当前层级，清理folderList中当前层级与以后层级的名称
						if (folderSize >= folderDepth) {
							
							for (int j = folderDepth; j < folderSize; j++) {
								
								folderList.remove(folderDepth);
							}
						}
						
						// 添加当前层级到层级列表
						folderList.add(row.getCell(1).getStringCellValue());
						
						// 然后重新计算目录
						folderBuffer = new StringBuffer();
						for (String folderStr : folderList) {
							
							folderBuffer.append("//");
							folderBuffer.append(folderStr);
						}
					}
					
					else if (cellValue_index_0.equals(">")) {
						
						// excel是什么就是什么
						String caseNum = row.getCell(1).getStringCellValue();
						// excel是什么就是什么
						String caseName = row.getCell(2).getStringCellValue();
						// excel是什么就是什么
						String caseLevel = row.getCell(3).getStringCellValue();
						// 将excel中的三列组装成一个JSONObject
						JSONObject caseSteps = new JSONObject();
						caseSteps.put("condition", row.getCell(4).getStringCellValue());
						caseSteps.put("teststep", row.getCell(5).getStringCellValue());
						caseSteps.put("expresult", row.getCell(6).getStringCellValue());
						// 是对应1，否对应0
						Integer caseType;
						if (row.getCell(9).getStringCellValue().equals("是")) {
							caseType = 1;
						}
						else {
							caseType = 0;
						}
						// NA对应{}
						JSONObject caseScript;
						if (row.getCell(10).getStringCellValue().equals("NA")) {
							caseScript = new JSONObject();
						} else {
							caseScript = JSON.parseObject(row.getCell(10).getStringCellValue());
						}
						// 第一个是创建记录
						JSONArray caseModifyInfo = new JSONArray();
						JSONObject createObj = new JSONObject();
						createObj.put("author", row.getCell(7).getStringCellValue());
						createObj.put("date", row.getCell(8).getStringCellValue());
						createObj.put("remark", "创建测试用例");
						caseModifyInfo.add(createObj);
						// excel是什么就是什么
						String casePid = row.getCell(12).getStringCellValue();
						// 给他一个默认值[]
						JSONArray caseExecInfo = new JSONArray();
						// excel是什么就是什么
						String caseBug = row.getCell(13).getStringCellValue();
						// excel是什么就是什么
						String caseRemark = row.getCell(14).getStringCellValue();
						// excel是什么就是什么
						String caseLastresult = row.getCell(11).getStringCellValue();
						// 上面计算出来的，去掉开头的//
						String casePath = folderBuffer.substring(2, folderBuffer.length());
						
						
						// 新建一个CaseInfo对象，并设置属性
						CaseObj caseobj = new CaseObj();
						caseobj.setNum(caseNum);
						caseobj.setName(caseName);
						caseobj.setLevel(caseLevel);
						caseobj.setSteps(caseSteps);
						caseobj.setType(caseType);
						caseobj.setScript(caseScript);
						caseobj.setModify(caseModifyInfo);
						caseobj.setPid(casePid);
						caseobj.setExec(caseExecInfo);
						caseobj.setBug(caseBug);
						caseobj.setRemark(caseRemark);
						caseobj.setLastresult(caseLastresult);
						caseobj.setPath(casePath);
						
						// 添加到结果数组中
						caseArry.add(caseobj);
					}
				}
			}
			
			workbook.close();
		} catch (Exception e) {
			
			logger.error("analyse case excel exception: " + e);
			return null;
		}
		
		return caseArry;
	}

	public static void main(String[] args) {
		
		File file = new File("C:\\Users\\FLY\\eclipse-workspace\\AutoTest\\支付相关.xlsx");
		
		System.out.println(analyseCaseExcel(file).toJSONString());
	}
}
